package com.kaguya.memento;

import java.util.ArrayList;
import java.util.List;

/**
 * 行为型，备忘录模式：
 * 对类的某个状态进行保存，当需要回滚时可以进行回滚
 * 实际应用：ctrl+z git rollback IE后退，游戏存档
 * 缺点：消耗资源
 */
public class Test {
    public static void main(String[] args) {
        // 备份类存对象会有浅拷贝问题

        // 历史记录
        Histories histories = new Histories();

        Originator originator = new Originator();
        originator.setState("step01");
        // 保存第二步
        Memento memento = originator.saveStateToMemento();
        histories.add(memento);
        System.out.println(originator.getState());

        originator.setState("step02");
        System.out.println(originator.getState());

        System.out.println("----------------rollback ing....");
        // 从历史记录拿
        Memento rollback = histories.get(0);
        // 回退到指定步骤
        originator.getStateFromMemento(rollback);
        System.out.println(originator.getState());
    }
}

/**
 * 备忘录类
 */
class Memento {

    /**
     * 保存原对象属性
     */
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String  getState() {
        return this.state;
    }
}

/**
 * 原对象类
 */
class Originator {

    /**
     * 属性
     */
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    /**
     * 保存到备忘录
     * @return
     */
    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    /**
     * 回退到指定的版本
     * @param memento
     */
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

/**
 * 历史记录类 管理备忘录对象
 */
class Histories {
    private List<Memento> histories = new ArrayList<>();

    /**
     * 新增一个备忘录
     * @param memento
     */
    public void add(Memento memento) {
        histories.add(memento);
    }

    /**
     * 获取
     * @param index
     * @return
     */
    public Memento get(int index) {
        return histories.get(index);
    }
}

